package com.exchange.controller.app.trade;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Date;

import com.exchange.controller.BaseController;
import com.exchange.interceptor.AppUserTokenInterceptor;
import com.exchange.util.ChartUtils;
import com.jfinal.aop.Before;
import com.jfinal.aop.Inject;
import com.jfinal.kit.Kv;
import com.jfinal.kit.Ret;

/**
 * 交易控制器
 * 撮合部分通过kafka对接撮合系统
 * @author zhangye
 */
@Before({TradeVaidator.class,AppUserTokenInterceptor.class})
public class TradeController extends BaseController {

	@Inject
    private TradeService service;
   
	
	/**
     * 用户下单
     * 1.验证账号
     * 2.验证余额
     * 3.将订单放入KAFKA队列
     * String coinTeam,Boolean isBuy,BigDecimal price,BigDecimal num,BigDecimal totalPrice
	 * @throws ParseException 
     */
    public void business(String coinTeam,Boolean isBuy,BigDecimal price,BigDecimal num) throws ParseException {
    	Ret ret = service.business(getAttr("user"),coinTeam,isBuy,price,num);
    	renderJson(ret);
    }

    /**
     * 用户撤单
     */
    public void revoke(String orderId) {
    	Ret ret = service.revoke(getAttr("user"),orderId);
    	renderJson(ret);
    }
    
    /**
     * 机器人下单
     *
     * @param dto
     * @return OrderDTO(coinPair=ADS_USDTOMNI, type=SELL, price=1.045, num=0.1746, totalPrice=null, userId=1, id=null)
     */
//    public ResponseData robotBook(@RequestBody OrderDTO dto) {
//        ResponseData data = ResponseData.ok();
//        try {
//        			
//            // 获取交易对数据
//        	MarketCoinEntity coin2TableEntity = getC2T(dto.getCoinPair());
//            
//            // 验证是否开盘
//            if (ObjectUtil.isEmpty(coin2TableEntity) || !BizUtils.isOpen(coin2TableEntity)) {
//                throw ExUtils.error( LocaleKey.MARKET_NOT_OPEN, new Object[] { dto.getCoinPair(),
//                        DateUtil.format( coin2TableEntity.getCreateTime(), DatePattern.NORM_DATETIME_MINUTE_PATTERN)});
//            }
//            // 当前登录用户
//            UserEntity user = userService.findUserByCondition(UserDTO.builder().id(dto.getUserId()).build());
//
//            if ( ObjectUtil.isNotEmpty( user)) {
//
//                if ( StrUtil.equals( BizConst.TradeConst.TRADE_TYPE_OUTS_EN, dto.getType())
//                        || StrUtil.equals( BizConst.TradeConst.TRADE_TYPE_INPUTS_EN, dto.getType())) {
//
//                	// 通过买卖判定是哪种钱包（前端传来的交易对EMC_USDT）,如果是“BUY”，取USDT否则取“EMC”
//                    String symbol = StrUtil.equals(BizConst.TradeConst.TRADE_TYPE_INPUTS_EN,dto.getType()) ? BizUtils.market( dto.getCoinPair()) : BizUtils.token( dto.getCoinPair());
//                	
//                	BigDecimal fee = NumberUtil.mul(dto.getNum(),new BigDecimal("0.002"));//暂时vbx:ADS=1
//                	CoinEntity coin = getToken(symbol);
//                    // 实际参数
//                    OrderFlowEntity entity = BeanUtil.toBean(dto, OrderFlowEntity.class);
//                    entity.setUserId(user.getId());
//
//                    // 当前交易对
//                    entity.setCoinPair(dto.getCoinPair());
//                    // 总额
//                    entity.setTotalPrice(NumberUtil.mul(dto.getNum(), dto.getPrice()));
//                    // 剩余成交额
//                    entity.setSurplusPrice(entity.getTotalPrice());
//                    entity.setFee(NumberUtil.mul(user.getFeeRate(),fee));
//                    entity.setState(BizConst.TradeConst.ORDER_TYPE_PENDING);
//                    entity.setNum(dto.getNum());
//                    entity.setSurplusNum(dto.getNum());
//                    entity.setFeeSymbol(coin.getFeeSymbol());
//                    entity.setSymbol(symbol);
//                    entity.setCreateDate(new Date());
//                    entity.setOrderNumber("" + user.getId() + Calendar.getInstance().getTimeInMillis());
//                    //放入队列
//                    tradeService.addOrderEntity( entity);
//                    
//                } else if(StrUtil.equals( BizConst.TradeConst.R_ORDER_TYPE_CANCEL, dto.getType())){
//                    //创建一个机器人撤单的订单对象
//                    OrderFlowEntity entity = OrderFlowEntity.builder()
//                            .userId(user.getId()).id( dto.getId())
//                            .type(dto.getType())
//                            .symbol(dto.getCoinPair())
//                            .coinPair(dto.getCoinPair())
//                            .state(BizConst.TradeConst.ORDER_TYPE_CANCEL).build();
//                    DictionaryFactory.blockTradeMap.get(entity.getCoinPair()).cancelOrder(entity);
//                }
//            }
//
//        } catch (Exception ex) {
//            ex.printStackTrace();
//            ExUtils.error(ex, LocaleKey.SYS_OPERATE_FAILED);
//        }
//        return data;
//    }
    
    
    /**
     * 分页获取历史订单（委托订单通过websocket）
     * coin交易对前者
     * market交易对后者
     * isBuy：
     * from：开始时间
     * to：结束时间
     */
    public void actives(String coin, String market, Boolean isBuy, Date from, Date to, Integer pageNumber){
    	Ret ret = service.activesPage(getAttr("user"), coin, market, isBuy, from, to, pageNumber);
    	renderJson(ret);
    }
	
    
    /**
     * 查询 交易行情排行（行情通过websocket，排行前端排序）
     */

    
    /**
     * 当前图表配置
     */
    public void chartConfig() {
    	Kv kv = ChartUtils.config();
    	renderJson(Ret.ok("chartConfig", kv));
    }

    /**
     * k线历史(在websocket处)
     */

    
}
